/**
 * Copyright &copy; 2013-2015 山东易科德软件有限公司   All rights reserved.
 */
package cn.net.ecode.modules.sys.entity;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;

import cn.net.ecode.common.config.Global;
import cn.net.ecode.common.persistence.DataEntity;
import cn.net.ecode.common.persistence.annotation.Id;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists;

/**
 * 单表Entity
 * @author 王震
 * @version 2014-8-19
 */
public class Role extends DataEntity<Role> {
	
	private static final long serialVersionUID = 1L;
	
	public static final String FENGONGHUI = "102";
	public static final String XIAOGONGHUI = "103";
	
	private String roleCode;	//角色编码
	private String roleName;	// 角色名称
	private String nameEn;		// 英文名称
	private String isSys;		// 系统内置（1是 0否）
	private String isShow;		// 是否显示（1显示 0隐藏）
	
//	private Office office;	// 归属机构
//	private String name; 	// 角色名称[roleName]
//	private String enname;	// 英文名称[nameEn]
//	private String roleType;// 权限类型
//	private String dataScope;// 数据范围
	
	private String oldName; 	// 原角色名称
	private String oldEnname;	// 原英文名称
//	private String sysData; 	//是否是系统数据[isSys]
//	private String useable; 	//是否是可用
	
	private String userCode;	// 根据用户编号查询授权的角色列表
	
	private List<String> codesList = Lists.newArrayList(); 	// 拥有用户列表
//	private List<User> userList = Lists.newArrayList(); 	// 拥有用户列表
	private List<Menu> menuList = Lists.newArrayList(); 	// 拥有菜单列表
//	private List<Office> officeList = Lists.newArrayList();	// 按明细设置数据范围
	
	public Role() {
		super();
//		this.dataScope = DATA_SCOPE_SELF;
//		this.useable=Global.YES;
	}

	public Role(String id){
		super(id);
	}
	
	public Role(User user){
		this();
		if (user != null){
			this.corpCode = user.getCorpCode();
			this.userCode = user.getUserCode();
		}
	}

	@Id
	public String getRoleCode() {
		return roleCode;
	}

	public void setRoleCode(String roleCode) {
		this.roleCode = roleCode;
	}
	
	@NotBlank(message="角色名称不能为空")
	@Length(min=0, max=100, message="角色名称长度不能超过 100 个字符")
	public String getRoleName() {
		return roleName;
	}

	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
	
	@Length(min=0, max=255, message="英文名称长度不能超过 255 个字符")
	public String getNameEn() {
		return nameEn;
	}

	public void setNameEn(String nameEn) {
		this.nameEn = nameEn;
	}
	
	@Length(min=0, max=1, message="系统内置（1是 0否）长度不能超过 1 个字符")
	public String getIsSys() {
		return isSys;
	}

	public void setIsSys(String isSys) {
		this.isSys = isSys;
	}
	
	@Length(min=0, max=1, message="是否显示（1显示 0隐藏）长度不能超过 1 个字符")
	public String getIsShow() {
		return isShow;
	}

	public void setIsShow(String isShow) {
		this.isShow = isShow;
	}

	public String getOldName() {
		return oldName;
	}

	public void setOldName(String oldName) {
		this.oldName = oldName;
	}

	public String getOldEnname() {
		return oldEnname;
	}

	public void setOldEnname(String oldEnname) {
		this.oldEnname = oldEnname;
	}

//	public List<User> getUserList() {
//		return userList;
//	}
//
//	public void setUserList(List<User> userList) {
//		this.userList = userList;
//	}
//	
//	public List<String> getUserIdList() {
//		List<String> nameIdList = Lists.newArrayList();
//		for (User user : userList) {
//			nameIdList.add(user.getId());
//		}
//		return nameIdList;
//	}
//
//	public String getUserIds() {
//		return StringUtils.join(getUserIdList(), ",");
//	}

	public List<String> getCodesList() {
		return codesList;
	}

	public void setCodesList(List<String> codesList) {
		this.codesList = codesList;
	}

	public String getUserCode() {
		return userCode;
	}

	public void setUserCode(String userCode) {
		this.userCode = userCode;
	}

	public List<Menu> getMenuList() {
		return menuList;
	}

	public void setMenuList(List<Menu> menuList) {
		this.menuList = menuList;
	}

	public List<String> getMenuIdList() {
		List<String> menuIdList = Lists.newArrayList();
		for (Menu menu : menuList) {
			menuIdList.add(menu.getId());
		}
		return menuIdList;
	}

	public void setMenuIdList(List<String> menuIdList) {
		menuList = Lists.newArrayList();
		for (String menuId : menuIdList) {
			Menu menu = new Menu();
			menu.setMenuCode(menuId);
			menuList.add(menu);
		}
	}

	public String getMenuIds() {
		return StringUtils.join(getMenuIdList(), ",");
	}
	
	public void setMenuIds(String menuIds) {
		menuList = Lists.newArrayList();
		if (menuIds != null){
			String[] ids = StringUtils.split(menuIds, ",");
			setMenuIdList(Lists.newArrayList(ids));
		}
	}
	
//	@Transient
//	public String getMenuNames() {
//		List<String> menuNameList = Lists.newArrayList();
//		for (Menu menu : menuList) {
//			menuNameList.add(menu.getName());
//		}
//		return StringUtils.join(menuNameList, ",");
//	}
//	
//	public List<Office> getOfficeList() {
//		return officeList;
//	}
//
//	public void setOfficeList(List<Office> officeList) {
//		this.officeList = officeList;
//	}
//
//	public List<String> getOfficeIdList() {
//		List<String> officeIdList = Lists.newArrayList();
//		for (Office office : officeList) {
//			officeIdList.add(office.getId());
//		}
//		return officeIdList;
//	}
//
//	public void setOfficeIdList(List<String> officeIdList) {
//		officeList = Lists.newArrayList();
//		for (String officeId : officeIdList) {
//			Office office = new Office();
//			office.setId(officeId);
//			officeList.add(office);
//		}
//	}
//	
//	public String getOfficeIds() {
//		return StringUtils.join(getOfficeIdList(), ",");
//	}
//	
//	public void setOfficeIds(String officeIds) {
//		officeList = Lists.newArrayList();
//		if (officeIds != null){
//			String[] ids = StringUtils.split(officeIds, ",");
//			setOfficeIdList(Lists.newArrayList(ids));
//		}
//	}
	
	/**
	 * 获取权限字符串列表
	 * @deprecated 暂时无用
	 */
	public List<String> getPermissions() {
		List<String> permissions = Lists.newArrayList();
		for (Menu menu : menuList) {
			if (menu.getPermission()!=null && !"".equals(menu.getPermission())){
				permissions.add(menu.getPermission());
			}
		}
		return permissions;
	}

	/**
	 * 是否是超级管理员
	 * @return
	 */
	@JsonIgnore
	public boolean isAdmin(){
		return isAdmin(this.id);
	}
	
	/**
	 * 是否是管理员（包括：超级管理员、二级管理员、集团管理员）
	 * @param id
	 * @return
	 */
	public static boolean isAdmin(String id){
		return id != null && (SUPER_ADMIN_ROLE_CODE.equals(id) 
				|| SEC_ADMIN_ROLE_CODE.equals(id)
				|| CORP_ADMIN_ROLE_CODE.equals(id));
	}

	/**
	 * 超级管理员角色编号
	 */
	public static final String SUPER_ADMIN_ROLE_CODE = Global.getConfig("user.superAdmin.roleCode");
	
	/**
	 * 二级管理员角色编号
	 */
	public static final String SEC_ADMIN_ROLE_CODE = Global.getConfig("user.secAdminUser.roleCode");

	/**
	 * 集团管理员角色编号
	 */
	public static final String CORP_ADMIN_ROLE_CODE = Global.getConfig("user.corpAdminUser.roleCode");
	
	/**
	 * 系统管理员角色编号（与超级管理员的区别：系统管理员是给客户用的（有限定权限的，但不受数据权限控制）；超级管理员是给开发或实施用的包括全部权限。）
	 */
	public static final String SYSTEM_ADMIN_ROLE_CODE = Global.getConfig("user.systemAdminUser.roleCode");
	
}
